Кваліфікований Електронний Підпис

Кваліфікований Електронний Підпис, або Кваліфіклована Електронна Печатка --- це набір стандартів криптографічного захисту ДСТУ 4145, та міжнародних стандартів які визначають його конверт: X.501, X.509, X.511, X.520.

Серія міжнародних стандартів X.500, групується по категоріям, кожна з яких має свій перелік ASN.1 файлів. Аби підключити усі визначення необхідні для КЕП використані наступі компоненти стандартів (виділені болдом): X.501 --- BasicAccessControl, InformationFramework, UsefulDefinitions; X.509 --- SpkmGssTokens, PkiPmiExternalDataTypes, AttributeCertificateDefinitions, AlgorithmObjectIdentifiers, AuthenticationFramework, CertificateExtensions; X.511 --- SpkmGssTokens, DirectoryAbstractService, X.520 --- PasswordPolicy, UpperBounds, SelectedAttributeTypes. Можно було би винести необхідні визначення одразу в KEP.asn1, однак цим хотілося підкреслити сумісність з міжнародними стандартами. Окрім серії протоколів X.500, КЕП ще визначає також запити та відповіді OCSP, також у ASN.1 форматі.

На відміну від самого алгоритму КЕП, який визначено ДСТУ 4145, конверти визначаються не стандартами, а наказами міністерства юстиції: Проект наказу Адміністрації Держспецзв'язку та Держкомінфоматизації (2009), Наказ Міністерства юстиції України 1236/5/453. Керуючись цими нормативними документами було створено файл KEP.asn1, який є одним з трьох top-level файлів необхідниї для компіляції ASN.1 компілятором.

Існує небагато безкоштовних та повних компіляторів (генераторів парсерів) ASN.1 специфікацій. Erlang є прикладом системи, до складу якої входить першокласний безкоштовний з відкритою ліценцією ASN.1 компілятор, де файли в ASN.1 нотації можуть бути зкомпільовані безпосередньо Erlang компілятором:

$ erlc AuthenticationFramework.asn1 $ erlc InformationFramework.asn1 $ erlc KEP.asn1

Створити файл підпису PKCS-7 можна за допомогою будь якої програми сертифікованої в Україні. Найпростіше отримати свою КЕП печатку будучи клієнтом ПриватБанку. За допомогою "Користувача ЦСК" компанії ІІТ ви можете підписувати файли використовуючи безкоштовну форму приватного ключа у вигляді звичайного файлу.

Щоб показати як користуватися КЕП, та прочитати атрибутивну інформацію з сертифікату, який вшитий в PCKS-7 повідомлення з криптографічним підписом, покажемо 5 функцій:

def parseContentInfoSMIME(file) do {:ok, smime} = :file.read_file(file) ; [_,base] = :string.split(smime, "\n\n") ; parseContentInfoBin(:base64.decode(base)) end def parseContentInfoB64(file) do {:ok, bin} = :file.read_file file ; parseContentInfoBin(:base64.decode(bin)) end def parseContentInfoFile(file) do {:ok, bin} = :file.read_file file ; parseContentInfoBin(bin) end def parseContentInfoBinUA(bin) do {:ok, contentInfo} = :KEP.decode(:ContentInfo, bin) ; parseContentInfo(contentInfo, true) end def parseContentInfoBinX509(bin) do {:ok, contentInfo} = :'CryptographicMessageSyntax-2010'.decode(:ContentInfo, bin) ; parseContentInfo(contentInfo, false) end

У результаті отримуємо наступний високорівневий інтерфейс:

> CA.CMS.parseContentInfoFile "test/CAdES/CAdES-BES-DSTU-4145.p7s" [ resourceType: :SignedData, version: :v1, cert: [ [ resourceType: :Certificate, version: :v3, signatureAlgorithm: :"dstu4145WithGost34311-pb", subject: [ cn: "ТЕСТ Тестовий Тест Тестович", sn: "Тестовий", givenName: "Тест Тестович", serialNumber: "1058", c: "UA", l: "Київ" ], issuer: [ o: "ДП \"ДІЯ\" (ТЕСТ)", cn: "Адміністратор ІТС ЦЗО (CA TEST)", serialNumber: "UA-43395033-2101", c: "UA", l: "Київ", organizationIdentifier: "NTRUA-43395033" ], serial: "AhQ2MEOAPpo0HAQAAAAiBAAA+XgAAA==", validity: [from: '240303220000Z', to: '260303215959Z'], publicKey: [ key: <<4, 33, 91, 177, 14, 11, 252, 136, 216, 23, 38, 65, 187, 197, 216, 35, 74, 43, 11, 64, 60, 163, 34, 100, 204, 35, 145, 239, 135, 242, 217, 222, 35, 110, 1>>, scheme: {1, 2, 804, 2, 1, 1, 1, 1, 3, 1, 1}, field: {:DSTU4145Params, {:ecbinary, {:ECBinary, 0, {:BinaryField, 257, {:t, 12}}, 0, <<16, 190, 227, 219, 106, 234, 158, 31, 134, 87, 140, 69, 193, 37, 148, 255, 148, 35, 148, 167, 215, 56, 249, 24, 126, 101, ...>>, 57896044618658097711785492504343953926772365604796032451169741553099060627213, <<182, 15, 210, 216, 220, 232, 169, 52, 35, 198, 16, 27, 202, 145, 196, 122, 0, 126, 108, 48, 11, 38, 205, 85, ...>>}}, <<169, 214, 235, 69, 241, 60, 112, 130, 128, 196, 150, 123, 35, 31, 94, 173, 246, 88, 235, 164, 192, 55, 41, 29, 56, 217, 107, 240, 37, 202, 78, 23, ...>>} ], extensions: [ subjectKeyIdentifier: "igFayiwDI1Vfh0ROFRArg3OA4ZmOoAQKtTxbsxzEAOo=", authorityKeyIdentifier: [ <<54, 48, 67, 128, 62, 154, 52, 28, 154, 151, 153, 18, 69, 97, 248, 219, 115, 140, 126, 63, 183, 189, 163, 241, 159, 230, 55, 168, 177, 195, 202, 32>> ], keyUsage: [:digitalSignature, :nonRepudiation], certificatePolicies: ["1.2.804.2.1.1.1.2.2", "1.3.6.1.5.5.7.2.1", "https://ca-test.czo.gov.ua/cps"], basicConstraints: [], qcStatements: ["0.4.0.1862.1.1", "0.4.0.1862.1.2", "UAH", "0.15.66.64", "0.0", "0.4.0.1862.1.5", "https://ca-test.czo.gov.ua/reglament", "en", "1.2.804.2.1.1.1.2.1"], subjectAltName: ["[email protected]", "1.3.6.1.4.1.311.20.2.3", "1"], cRLDistributionPoints: ["http://ca-test.czo.gov.ua/download/crls/TestCSK-2021-Full.crl"], freshestCRL: ["http://ca-test.czo.gov.ua/download/crls/TestCSK-2021-Delta.crl"], authorityInfoAccess: [ {"1.3.6.1.5.5.7.48.2", "https://ca-test.czo.gov.ua/download/certificates/TestCA2021.p7b"}, {"1.3.6.1.5.5.7.48.1", "http://ca-test.czo.gov.ua/services/ocsp/"} ], subjectInfoAccess: [ {"1.3.6.1.5.5.7.48.3", "http://ca-test.czo.gov.ua/services/tsp/"} ] ] ] ], signerInfo: [ [ resourceType: :SignerInfo, issuer: [ o: "ДП \"ДІЯ\" (ТЕСТ)", cn: "Адміністратор ІТС ЦЗО (CA TEST)", serialNumber: "UA-43395033-2101", c: "UA", l: "Київ", organizationIdentifier: "NTRUA-43395033" ], keyAlg: {1, 2, 804, 2, 1, 1, 1, 1, 2, 1}, signatureAlg: {1, 2, 804, 2, 1, 1, 1, 1, 3, 1, 1}, signedAttrs: [ contentType: {1, 2, 840, 113549, 1, 7, 1}, signingTime: "240304082625Z", messageDigest: "vhSPLtug9UJy3ZGsXHecfG28cC7KmSiw96+Y0foq+Tg=", signingCertificateV2: 309361817556530004395837158894224188190313938944, contentTimestamp: {"1.2.840.113549.1.7.2", 4585411, "20240304082626Z", "vhSPLtug9UJy3ZGsXHecfG28cC7KmSiw96+Y0foq+Tg="} ], attrs: [] ] ], signedContent: "Test\r\n" ]

Даний код можна знайти як частину нашої synrc/ca бібліотеки: 🛡️ CA: Certificate Authority — authority.erp.uno